<?php
/**
 * @brief Klasa mapująca dane z bazy danych na obiekty klasy encyjnej Application_Model_Commodity.
 *
 * Obiekty tej klasy pośredniczą wymianie danych między bazą danych a obiektami klasy Application_Model_Commodity.
 * Za pomocą metod z przypisanej klasy tabeli tworzą obiekty na podstawie danych z bazy danych 
 * oraz zapisują informacje z obiektów do bazy danych.
 * 
 */
class Application_Model_CommodityMapper
{
    protected $_dbTable; /*!<  Klasa tabeli */

    /**
     * @brief Metoda do ustawiania nazwy powiązanej klasy tabel o podanej nazwie.
     * 
     * @param string $dbTable
     * @return Application_Model_CommodityMapper 
     */
    public function setDbTable($dbTable) {

        if (is_string($dbTable)) {

            $dbTable = new $dbTable();
        }

        if (!$dbTable instanceof Zend_Db_Table_Abstract) {

            throw new Exception('Invalid table data gateway provided');
        }

        $this->_dbTable = $dbTable;

        return $this;
    }

    /**
     * @brief Metoda zwracająca klasę tabel.
     * 
     * @return Application_Model_DbTable_Commodity
     */
    public function getDbTable() {

        if (null === $this->_dbTable) {

            $this->setDbTable('Application_Model_DbTable_Commodity');
        }

        return $this->_dbTable;
    }

    /**
     * @brief Metoda zapisująca informacje do bazy danych  z obiektu reprezentującego towar.
     *
     * Metoda służy zarówno do tworzenia w bazie danych nowych rekordów, jak i aktualizacji starych. 
     * Aktualizacja następuje w przypadku, gdy obiekt posiada już indywidualny identyfikator.
     * 
     * @param Application_Model_Commodity $commodity 
     */
    public function save(Application_Model_Commodity $commodity) { 

        $data = array(

            'CommodityType_id'  =>  $commodity->getCommodityType_id(),
            'MarketEntity_id'   =>  $commodity->getMarketEntity_id(),
            'CalendarPeriod_id' =>  $commodity->getCalendarPeriod_id(),
            'NetworkNode_id'    =>  $commodity->getNetworkNode_id(),
            'NetworkArc_id'     =>  $commodity->getNetworkArc_id(),
            'name'              =>  $commodity->getName(),
            'description'       =>  $commodity->getDescription(),
            'hasDeliveryTime'   =>  $commodity->getHasDeliveryTime(),
            'startTime'         =>  $commodity->getStartTime(),
            'endTime'           =>  $commodity->getEndTime(),
            'used'              =>  $commodity->getUsed(),
                
        );



        if (null === ($id = $commodity->getCommodity_id())) { 

            unset($data['Commodity_id']);

            $this->getDbTable()->insert($data);
        } else {

            $this->getDbTable()->update($data, array('Commodity_id = ?' => $id));
        }
    }

    /**
     * @brief Metoda wyszukująca towary na podstawie identyfikatora.
     *
     * Metoda generuje pojedynczy obiekt reprezentujący towar na podstawie rekordu, o podanym
     * identyfikatorze, znalezionego w bazie danych.
     * 
     * @param int $id
     * @return Application_Model_Commodity | NULL
     */
    public function find($id) { 
	$commodity = new Application_Model_Commodity(); 
        $result = $this->getDbTable()->find($id);

        if (0 == count($result)) {

            return;
        }

        $row = $result->current();


        $commodity->setCommodity_id($row->Commodity_id);
        $commodity->setCommodityType_id($row->CommodityType_id);
        $commodity->setMarketEntity_id($row->MarketEntity_id);
        $commodity->setCalendarPeriod_id($row->CalendarPeriod_id);
        $commodity->setNetworkNode_id($row->NetworkNode_id);
        $commodity->setNetworkArc_id($row->NetworkArc_id);
        $commodity->setName($row->name);
        $commodity->setDescription($row->description);
        $commodity->setHasDeliveryTime($row->hasDeliveryTime);
        $commodity->setStartTime($row->startTime);
        $commodity->setEndTime($row->endTime);
        $commodity->setUsed($row->used);
        
        return $commodity;

    }

    /**
     * @brief Metoda wyszukująca zbiór towarów na podstawie danych wejściowych.
     *
     * Metoda wyszukuje zbiór towarów  i zwraca tablicę obiektów Application_Model_Commodity.
     * Zbiór rekordów uzyskanych z klasy tabel jest przetwarzany przez inną metodę.
     * 
     * @param string $query
     * @return array Application_Model_Commodity 
     */
    public function fetchAll($query = NULL) {
        if ($query === NULL) {
            $resultSet = $this->getDbTable()->fetchAll();
            
        } else {
            $table = $this->getDbTable();
            $select = $table->select();
            $select->from($table)
                    ->where($query);

            $resultSet = $this->getDbTable()->fetchAll($select);
        }
        return $this->processResultSet($resultSet);
    }
    
    public function fetchByAuction($auctionId) {

        $db = Zend_Db_Table::getDefaultAdapter();
        $select = $db->select();
        $select->from(array('c'=>'commodity'));
        $select->join(array('a'=>'commodityaffiliation'),'a.Commodity_id = c.Commodity_id');
        $select->where('a.Auction_id = ?',$auctionId);
       
        //throw new Exception('tu jestem'); 
       $results = array();
       $resultSet = $db->fetchAll($select);
       foreach ($resultSet as $key=>$value) {
           $commodity = new Application_Model_Commodity($value);
           $commodity->setTemporaryShareFactor($value['shareFactor']);
           $results[] = $commodity;
       }
       return $results;
    }

    /**
     * @brief Metoda przetwarza rekordy na obiekty.
     *
     * @param Zend_Db_Table_Rowset $resultSet
     * @return array Application_Model_Commodity 
     */
    private function processResultSet($resultSet) {
        $entries = array();
        foreach ($resultSet as $row) {

            $commodity = new Application_Model_Commodity();

            $commodity->setCommodity_id($row->Commodity_id);
            $commodity->setCommodityType_id($row->CommodityType_id);
            $commodity->setMarketEntity_id($row->MarketEntity_id);
            $commodity->setCalendarPeriod_id($row->CalendarPeriod_id);
            $commodity->setNetworkNode_id($row->NetworkNode_id);
            $commodity->setNetworkArc_id($row->NetworkArc_id);
            $commodity->setName($row->name);
            $commodity->setDescription($row->description);
            $commodity->setHasDeliveryTime($row->hasDeliveryTime);
            $commodity->setStartTime($row->startTime);
            $commodity->setEndTime($row->endTime);
            $commodity->setUsed($row->used);

            $entries[] = $commodity;
        }
        return $entries;
    }
    /**
     * @brief Metoda zlicza rekordy odpowiadających podanym kryteriom.
     * 
     * 
     * @param string $query
     * @return int
     */
    public function count($query = NULL)
    {
        $table = $this->getDbTable();
        $select = $table->select();
        $select->from($table,array('count(*) as amount'));
        if($query != NULL)
        $select->where($query);
        $rows = $table->fetchAll($select);
        return($rows[0]->amount); 
    }
    
    /**
     * @brief Metoda zlicza rekordy odpowiadających podanym kryteriom.
     * 
     * @param int $id 
     */
    public function delete($id)
    {
        $this->getDbTable()->delete('Commodity_id = '.$id);
    }
}

